package initialize

import (
	"goweb/web/config"
	"goweb/web/global"
	"log"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
)

func Gorm() *gorm.DB {
	return gormMysql()
}

func gormMysql() *gorm.DB {
	d := global.Config.DataBase

	if d.DbName == "" {
		return nil
	}

	dsn := d.Username + ":" + d.Password + "@tcp(" + d.Path + ")/" + d.DbName + "?" + d.Config

	myConfig := mysql.Config{
		DSN:                       dsn,
		DefaultStringSize:         256,
		DisableDatetimePrecision:  true,  // 禁用 datetime 精度，MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex:    true,  // 重命名索引时采用删除并新建的方式，MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true,  // 用 `change` 重命名列，MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false, // 根据版本自动配置
	}
	// 连接数据库
	db, err := gorm.Open(mysql.New(myConfig), gormConfig())

	return gormInit(db, err, d)
}

// 配置sqlDB
func gormInit(db *gorm.DB, err error, d config.DataBase) *gorm.DB {
	if err != nil {
		panic(err)
	}

	// 配置sqlDB
	sqlDB, _ := db.DB()

	err2 := sqlDB.Ping()
	if err2 != nil {
		log.Fatal(err2.Error())
	}

	// See "Important settings" section.
	// 设置空闲连接池中连接的最大数量
	sqlDB.SetMaxIdleConns(10)
	// 设置打开数据库连接的最大数量。
	sqlDB.SetMaxOpenConns(100)
	// 设置了连接可复用的最大时间。
	sqlDB.SetConnMaxLifetime(time.Hour)

	return db
}

// 配置 gorm: 可以使用默认gorm配置: &gorm.Config{}
func gormConfig() *gorm.Config {
	config := &gorm.Config{
		DisableForeignKeyConstraintWhenMigrating: true,
		NamingStrategy: schema.NamingStrategy{
			TablePrefix:   "axg_", // 设置表前缀
			SingularTable: true,   // 使用单数表名
		},
	}
	return config
}
